package com.ruoyi.ldzlsb.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.common.core.utils.file.FileTypeUtils;
import com.ruoyi.common.core.utils.file.MimeTypeUtils;
import com.ruoyi.common.core.web.controller.BaseController;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.system.api.RemoteFileService;
import com.ruoyi.system.api.domain.SysFile;

import javax.annotation.Resource;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

/**
 * 文件上传处理控制器
 */
@RestController
@RequestMapping("/sb/upload")
public class SbFileUploadController extends BaseController {

    private static final Logger log = LoggerFactory.getLogger(SbFileUploadController.class);

    @Resource
    private RemoteFileService remoteFileService;

    /**
     * 上传设备图片
     */
    @PostMapping("/image")
    public AjaxResult uploadImage(@RequestPart("avatarfile") MultipartFile file) {
        try {
            if (file == null || file.isEmpty()) {
                return AjaxResult.error("上传文件不能为空");
            }

            // 校验文件类型
            String extension = FileTypeUtils.getExtension(file);
            if (!StringUtils.equalsAnyIgnoreCase(extension, MimeTypeUtils.IMAGE_EXTENSION)) {
                return error("文件格式不正确，请上传" + Arrays.toString(MimeTypeUtils.IMAGE_EXTENSION) + "格式");
            }

            // 使用远程文件服务进行上传（提供加密和安全性）
            R<SysFile> fileResult = remoteFileService.upload(file);
            if (StringUtils.isNull(fileResult) || StringUtils.isNull(fileResult.getData())) {
                return error("文件服务异常，请联系管理员");
            }

            // 获取文件访问URL
            String imageUrl = fileResult.getData().getUrl();
            log.info("设备图片上传成功，返回URL：{}", imageUrl);
            
            // 返回图片访问路径
            Map<String, Object> data = new HashMap<>();
            data.put("url", imageUrl);
            data.put("fileName", file.getOriginalFilename());
            data.put("newFileName", imageUrl.substring(imageUrl.lastIndexOf("/") + 1));
            data.put("originalFilename", file.getOriginalFilename());
            
            return AjaxResult.success("上传成功", data);
        } catch (Exception e) {
            log.error("文件上传失败", e);
            return AjaxResult.error(e.getMessage());
        }
    }
    
    /**
     * 上传故障图片
     */
    @PostMapping("/fault-image")
    public AjaxResult uploadFaultImage(@RequestPart("avatarfile") MultipartFile file) {
        try {
            if (file == null || file.isEmpty()) {
                return AjaxResult.error("上传文件不能为空");
            }

            // 校验文件类型
            String extension = FileTypeUtils.getExtension(file);
            if (!StringUtils.equalsAnyIgnoreCase(extension, MimeTypeUtils.IMAGE_EXTENSION)) {
                return error("文件格式不正确，请上传" + Arrays.toString(MimeTypeUtils.IMAGE_EXTENSION) + "格式");
            }

            // 使用远程文件服务进行上传（提供加密和安全性）
            R<SysFile> fileResult = remoteFileService.upload(file);
            if (StringUtils.isNull(fileResult) || StringUtils.isNull(fileResult.getData())) {
                return error("文件服务异常，请联系管理员");
            }

            // 获取文件访问URL
            String imageUrl = fileResult.getData().getUrl();
            log.info("故障图片上传成功，返回URL：{}", imageUrl);
            
            // 返回图片访问路径
            Map<String, Object> data = new HashMap<>();
            data.put("url", imageUrl);
            data.put("fileName", file.getOriginalFilename());
            data.put("newFileName", imageUrl.substring(imageUrl.lastIndexOf("/") + 1));
            data.put("originalFilename", file.getOriginalFilename());
            
            return AjaxResult.success("上传成功", data);
        } catch (Exception e) {
            log.error("故障图片上传失败", e);
            return AjaxResult.error(e.getMessage());
        }
    }
}
